﻿using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Cofe.Core;

namespace Cofe.Data
{
    [Export(typeof(ICofeService))]
    [ServicePriority(ServicePriorityAttribute.DefaultPriority_COFEDB)]
    public class EFPropertyPairConfig : IDatabaseConfigurator
    {
        public void OnDatabaseCreating(CofeDbContext context)
        {            
        }

        public void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var propertyPairConfig = modelBuilder.Entity<PropertyPair>();            

            modelBuilder.Entity<DatabaseEntry>().HasMany(e => e.ExtendedProperties).WithRequired()
                .HasForeignKey(e => e.EntityId)
                //.Map(m => m.MapKey("EntityId"))
                .WillCascadeOnDelete();

            propertyPairConfig.ToTable("PropertyPair");
            propertyPairConfig.HasKey(e => new { e.PropertyId, e.EntityId });
            propertyPairConfig.Property(e => e.PropertyId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
            propertyPairConfig.Ignore(e => e.Value);
            propertyPairConfig.Ignore(e => e.Type);
            propertyPairConfig.Ignore(e => e.Property);
            propertyPairConfig.Ignore(e => e.ValueIsLoaded);
            propertyPairConfig.Ignore(e => e.IsValid);

            propertyPairConfig.Map<PropertyPairDouble>(m =>
            {
                m.Requires("Type").HasValue("Double");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_Double");
            });

            propertyPairConfig.Map<PropertyPairInt16>(m =>
            {
                m.Requires("Type").HasValue("Int16");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_Int16");
            });


            propertyPairConfig.Map<PropertyPairInt32>(m =>
            {
                m.Requires("Type").HasValue("Int32");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_Int32");
            });


            propertyPairConfig.Map<PropertyPairInt64>(m =>
            {
                m.Requires("Type").HasValue("Int64");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_Int64");
            });


            propertyPairConfig.Map<PropertyPairDateTime>(m =>
            {
                m.Requires("Type").HasValue("DateTime");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_DateTime");
            });

            propertyPairConfig.Map<PropertyPairBool>(m =>
            {
                m.Requires("Type").HasValue("Bool");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_Bool");
            });

            propertyPairConfig.Map<PropertyPairGuid>(m =>
            {
                m.Requires("Type").HasValue("Guid");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_Guid");
            });

            propertyPairConfig.Map<PropertyPairString>(m =>
            {
                m.Requires("Type").HasValue("String");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_String");
            });

            propertyPairConfig.Map<PropertyPairByteArray>(m =>
            {
                m.Requires("Type").HasValue("ByteArray");
                m.Properties(e => new { e.ORMValue });
                m.ToTable("PropertyPair_ByteArray");
            });

        }
    }
}
